home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
ippon
/
source.lzh
/
FuncEnemy
/
lboss01.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-07-07
|
17KB
|
647 lines
/* lboss01.c 1面ボス */
#include <xsp2lib.h>
#include "../main.h"
#include "../player.h"
#include "../shot.h"
#include "../enemy.h"
#include "../eshot.h"
#include "../effect.h"
#include "../psearch.h"
#include "../sound.h"
#ifdef DEBUG
#include <stdio.h>
#include "../txfont.h"
#endif
#define PALET_MAIN 0x0700
#define SPEED_LASER 30
#define SPEED_1 3 /* 加速度 */
#define SPEED_1N 28 /* 加速度を足す回数 */
#define SPEED_SHOT1 8 /* 1段階目扇型ショット速度 */
#define SPEED_SHOT2 10 /* 2段階目伸びるショットの一番遅い弾の速度 */
#define SPEED_SHOT3 12 /* 2段階目なぎ倒し弾の速度 */
#define HP_0 1800 /* 耐久力 */
#define HP_1 1000 /* 耐久力がこれ以下になったら2段階目へ */
#define HP_2 500 /* 耐久力がこれ以下になったら3段階目へ */
#define TIMER_1 2500 /* これ以上時間が経過したら2段階目へ */
#define TIMER_2 4000 /* これ以上時間が経過したら3段階目へ */
#define TIMER_3 6000 /* これ以上時間が経過したら撤退 */
#define TIME_SHOT_ERASE 50 /* 耐久力がこれだけ減るごとにショットを抜く */
#define SPEED_3 3 /* 3段階目(撤退)の加速度 */
#define SPEED_3N 32 /* 3段階目の加速度を足す回数 */
#define MOVE_DEATH 8
enum {
MOVETO_INIT = 0, /* 初期状態 */
MOVETO_C2L, /* 中央から左に移動 */
MOVETO_L2C,
MOVETO_C2R,
MOVETO_R2C
};
/* 関数プロトタイプ宣言 */
static short EnemyMoveLBoss01 (ENEMY *);
static void EnemyFreeLBoss01 (ENEMY *);
/* 初期化ルーチン */
void EnemyAllocLBoss01 (ENEMY * p)
{
p->vx = 0;
p->vy = -6 << 16;
p->pt = obj_lboss01 + 1;
p->info = PALET_MAIN | PRIORITY_BOSS;
p->hit_sx = p->hit_sy = 0; /* 当たり判定なし */
p->hp = HP_0;
p->damage = 0;
p->flash = 0;
p->damage_mode = DAMAGE_PIERCE;
p->func_enemy_move = EnemyMoveLBoss01;
p->func_enemy_free = EnemyFreeLBoss01;
/* コア関連 */
p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
p->core_pt = sp_core;
p->m_work = 0;
p->m_work5 = 0;
p->timer = 0;
}
/* 移動ルーチン */
/* 返り値:非0なら消去 */
static short EnemyMoveLBoss01 (ENEMY * p)
{
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
p->x = (p->lx += p->vx) >> 16;
p->y = (p->ly += p->vy) >> 16;
p->timer++;
#ifdef DEBUG
{
char temp_str[32];
sprintf (temp_str, "TIMER %06d", p->timer);
TxfontCursor (20, 2);
TxfontPuts (temp_str);
sprintf (temp_str, "HP %06hd", p->hp);
TxfontCursor (20, 3);
TxfontPuts (temp_str);
}
#endif
switch (p->m_work) {
/* まず上に上がってくる */
case 0:
if (SHORT_LY < 200)
p->m_work++;
break;
/* 減速 */
case 1:
p->vy += 8192;
if (p->vy > -8192) {
p->m_work++;
p->vy = 0;
p->hit_sx = 54; /* ここで初めて当たり判定ができる */
p->hit_sy = 16;
p->m_work2 = MOVETO_INIT; /* 移動方向 */
p->s_work = p->s_work2 = p->s_work3 = 0;
}
break;
/* 第1形態・左右に移動しつつ扇状弾 */
case 2:
/* まず移動処理 */
if (p->m_work2 == MOVETO_INIT) {
/* 初期状態なら */
if (p->x > player->x)
p->m_work2 = MOVETO_C2L; /* 移動方向 */
else
p->m_work2 = MOVETO_C2R; /* 移動方向 */
p->m_work3 = 0;
}
if (p->m_work3 == 0) {
/* 初回なら */
signed short dx, dy;
signed short dx_table[5] =
{0, 54 + 16, 128 + 16, 256 - 54 + 16, 128 + 16};
short m_work_table[5] =
{MOVETO_INIT, MOVETO_L2C, MOVETO_C2R, MOVETO_R2C, MOVETO_C2L};
p->m_work3 = !0;
/* 順に左→中央→右→中央→左へ移動 */
dx = dx_table[p->m_work2];
p->m_work2 = m_work_table[p->m_work2]; /* 移動方向 */
/* player->y は乱数の種として使用しています */
if (SHORT_LY < 80)
dy = (((unsigned short) rndtable[(player->y) & 0xff]) / 4 + 32 + 16);
else
dy = 64;
/* 移動方向を設定 */
SubEnemyMoveToInit (p, dx, dy, SPEED_1, SPEED_1N);
} else {
/* 設定値に従って移動 */
if (SubEnemyMoveTo (p) < 0)
p->m_work3 = 0; /* 移動方向再設定 */
}
/* 次に攻撃処理 */
switch (p->s_work) {
/* なぎたおし弾 */
case 0: /* p->s_work */
#define INTERVAL_2_0 6
#define SPEED_SHOT_2_0 9
switch (p->s_work2++) {
case 0:
p->s_angle = 64 - 32;
p->s_angle2 = 64 + 32;
break;
case 20 + INTERVAL_2_0 * 0:
EshotAlloc (ESHOT_NRG24N, SHORT_LX, SHORT_LY, SPEED_SHOT_2_0, p->s_angle, 3);
EshotAlloc (ESHOT_NRG24N, SHORT_LX, SHORT_LY, SPEED_SHOT_2_0, p->s_angle2, 3);
p->s_angle += 6;
p->s_angle2 -= 6;
SoundSetSE (SE_ESHOT); /* 敵ショット音 */
case 20 + INTERVAL_2_0 * 1:
case 20 + INTERVAL_2_0 * 2:
case 20 + INTERVAL_2_0 * 3:
case 20 + INTERVAL_2_0 * 4:
case 20 + INTERVAL_2_0 * 5:
case 20 + INTERVAL_2_0 * 6:
case 20 + INTERVAL_2_0 * 7:
case 20 + INTERVAL_2_0 * 8:
case 20 + INTERVAL_2_0 * 9:
case 20 + INTERVAL_2_0 * 10:
case 20 + INTERVAL_2_0 * 11:
case 20 + INTERVAL_2_0 * 12:
case 20 + INTERVAL_2_0 * 13:
EshotAlloc (ESHOT_NRG04, SHORT_LX, SHORT_LY, SPEED_SHOT_2_0, p->s_angle, 3);
EshotAlloc (ESHOT_NRG04, SHORT_LX, SHORT_LY, SPEED_SHOT_2_0, p->s_angle2, 3);
p->s_angle += 6;
p->s_angle2 -= 6;
SoundSetSE (SE_ESHOT); /* 敵ショット音 */
break;
case 20 + INTERVAL_2_0 * 15:
p->s_work2 = 0;
if (p->s_work3++ > 1) {
p->s_work++;
p->s_work3 = 0;
}
break;
default:
break;
}
break;
/* V字弾 */
case 1: /* p->s_work */
#define INTERVAL_2_1 40
#define SPEED_SHOT_2_1 12
switch (p->s_work2++) {
case 10 + INTERVAL_2_1 * 0:
case 10 + INTERVAL_2_1 * 1:
case 10 + INTERVAL_2_1 * 2:
case 10 + INTERVAL_2_1 * 3:
case 10 + INTERVAL_2_1 * 4:
case 10 + INTERVAL_2_1 * 5:
case 10 + INTERVAL_2_1 * 6:
case 10 + INTERVAL_2_1 * 7:
case 10 + INTERVAL_2_1 * 8:
EshotAlloc (ESHOT_NRG02, SHORT_LX + 24, SHORT_LY - 24, SPEED_SHOT_2_1, 64 - 18, 2);
EshotAlloc (ESHOT_NRG02, SHORT_LX - 24, SHORT_LY - 24, SPEED_SHOT_2_1, 64 + 18, 2);
EshotAlloc (ESHOT_NRG03, SHORT_LX + 16, SHORT_LY - 12, SPEED_SHOT_2_1, 64 - 12, 2);
EshotAlloc (ESHOT_NRG03, SHORT_LX - 16, SHORT_LY - 12, SPEED_SHOT_2_1, 64 + 12, 2);
EshotAlloc (ESHOT_NRG04, SHORT_LX + 8, SHORT_LY, SPEED_SHOT_2_1, 64 - 6, 2);
EshotAlloc (ESHOT_NRG04, SHORT_LX - 8, SHORT_LY, SPEED_SHOT_2_1, 64 + 6, 2);
EshotAlloc (ESHOT_NRG05, SHORT_LX, SHORT_LY + 12, SPEED_SHOT_2_1, 64, 2);
SoundSetSE (SE_ESHOT); /* 敵ショット音 */
break;
case 10 + INTERVAL_2_1 * 10:
p->s_work++;
p->s_work2 = 0;
p->s_work3 = 0;
p->s_angle = 64;
break;
default:
break;
}
break;
/* うずまき弾 */
case 2: /* p->s_work */
if (p->s_work2++ > 1) {
p->s_work2 = 0;
if (p->s_work3++ > 120) {
p->s_work = p->s_work2 = p->s_work3 = 0;
}
#define SPEED_SHOT_2_2 8
EshotAlloc (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT_2_2, p->s_angle, 4);
EshotAlloc (ESHOT_NRG04, SHORT_LX, SHORT_LY, SPEED_SHOT_2_2, p->s_angle + 85, 4);
EshotAlloc (ESHOT_NRG05, SHORT_LX, SHORT_LY, SPEED_SHOT_2_2, p->s_angle + 170, 4);
p->s_angle += 6;
SoundSetSE (SE_ESHOT); /* 敵ショット音 */
}
break;
default: /* p->s_work */
p->s_work = 0;
break;
}
/* ある程度ダメージを受けた or 時間切れ */
if ((p->hp < HP_1) || (p->timer > TIMER_1)) {
/* カバー破棄 */
EnemyAlloc (ENEMY_LBOSS01C, SHORT_LX, SHORT_LY); /* カバーを分離 */
if (!eshot_erase)
eshot_erase = ESHOT_ERASE; /* 弾消し */
p->pt++;
p->m_work++;
p->m_work2 = 0;
p->m_work3 = 0;
p->hit_sx = p->hit_sy = 0; /* 当たり判定なし */
/* 刺さったショットの処理 */
if (p->shot)
p->shot->status = SHOT_STATUS_NON;
}
break;
case 3: /* アニメーション開始! */
p->m_work3++;
switch (p->m_work2) {
case 0:
if (SubEnemyMoveTo (p) < 0) /* 止まるまで待つ */
p->m_work2++;
break;
case 1:
if (p->m_work3 < 100)
break;
if (p->pt < obj_lboss01 + 50) {
p->pt++;
} else {
p->m_work++;
p->m_work2 = MOVETO_INIT; /* 移動方向 */
p->s_work = p->s_work2 = p->s_work3 = p->s_work4 = 0;
p->s_angle3 = 0;
p->hit_sx = 70;
p->hit_sy = 16;
}
if ((p->pt == obj_lboss01 + 9) || (p->pt == obj_lboss01 + 30) || (p->pt == obj_lboss01 + 46))
SoundSetSE (SE_LOCK_M); /* 「がちゃん」という効果音を鳴らす */
break;
}
break;
/* 第2形態 */
case 4:
/* ある程度ダメージを受けた or 時間切れ */
if ((p->hp < HP_2) || (p->timer > TIMER_2)) {
p->m_work++; /* 時間切れ */
p->m_work2 = MOVETO_INIT; /* 移動方向 */
p->hit_sx = p->hit_sy = 0; /* 当たり判定なし */
EffectAlloc (EFFECT_EXPL, 0, p->x, p->y); /* 爆発パターンを出現させる */
SoundSetSE (SE_EXPL_M); /* 中ボス爆発音 */
if (!eshot_erase)
eshot_erase = ESHOT_ERASE; /* 弾消し */
/* 刺さったショットの処理 */
if (p->shot)
p->shot->status = SHOT_STATUS_NON;
break;
}
/* まず移動処理 */
if (p->m_work2 == MOVETO_INIT) {
/* 初期状態なら */
if (p->x > player->x)
p->m_work2 = MOVETO_C2L; /* 移動方向 */
else
p->m_work2 = MOVETO_C2R; /* 移動方向 */
p->m_work3 = 0;
}
if (p->m_work3 == 0) {
/* 初回なら */
signed short dx, dy;
signed short dx_table[5] =
{0, 54 + 16, 128 + 16, 256 - 54 + 16, 128 + 16};
short m_work_table[5] =
{MOVETO_INIT, MOVETO_L2C, MOVETO_C2R, MOVETO_R2C, MOVETO_C2L};
p->m_work3 = !0;
/* 順に左→中央→右→中央→左へ移動 */
dx = dx_table[p->m_work2];
p->m_work2 = m_work_table[p->m_work2]; /* 移動方向 */
/* player->y は乱数の種として使用しています */
if (SHORT_LY < 80)
dy = (((unsigned short) rndtable[(player->y) & 0xff]) / 4 + 32 + 16);
else
dy = 64;
/* 移動方向を設定 */
SubEnemyMoveToInit (p, dx, dy, SPEED_1, SPEED_1N);
} else {
/* 設定値に従って移動 */
if (SubEnemyMoveTo (p) < 0)
p->m_work3 = 0; /* 移動方向再設定 */
}
/* 次に攻撃処理 */
switch (p->s_work) {
#define INTERVAL_4 9
#define SPEED_SHOT_4_0 20 /* 3ウェイ弾 */
#define SPEED_SHOT_4_0_1 11 /* 円形炸裂弾 */
#define SPEED_SHOT_4_0_2 6 /* 半円形炸裂弾 */
case 0: /* p->s_work */
switch (p->s_work2++) {
case 0:
p->s_angle = psearch (p->x, p->y); /* 自機の方向をサーチ */
break;
case 15 + INTERVAL_4 * 0:
case 15 + INTERVAL_4 * 1:
case 15 + INTERVAL_4 * 2:
case 15 + INTERVAL_4 * 3:
EshotAlloc (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT_4_0 - 4, p->s_angle - 24, 0);
EshotAlloc (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT_4_0 - 4, p->s_angle + 24, 0);
EshotAlloc (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT_4_0 - 2, p->s_angle - 12, 0);
EshotAlloc (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT_4_0 - 2, p->s_angle + 12, 0);
EshotAlloc (ESHOT_NRG05, SHORT_LX, SHORT_LY, SPEED_SHOT_4_0, p->s_angle, 0);
SoundSetSE (SE_ESHOT); /* 敵ショット音 */
break;
case 15 + INTERVAL_4 * 4:
{
short h;
unsigned char a = 0;
for (h = 0; h < 16; h++)
EshotAlloc (ESHOT_NRG35, SHORT_LX, SHORT_LY, SPEED_SHOT_4_0_1, a += 16, 0);
}
SoundSetSE (SE_EBOMB_L); /* 敵ショット音 */
break;
case 15 + INTERVAL_4 * 7:
{
short h;
unsigned char a = psearch (p->x, p->y) - 10 * 4;
for (h = 0; h < 9; h++)
EshotAlloc (ESHOT_NRG34N, SHORT_LX, SHORT_LY, SPEED_SHOT_4_0_2, a += 10, 0);
}
SoundSetSE (SE_EBOMB_M); /* 敵ショット音 */
break;
case 15 + INTERVAL_4 * 8:
p->s_work2 = 0;
if (p->s_work3++ > 0) {
p->s_work++;
p->s_work2 = p->s_work3 = 0;
}
break;
default:
break;
}
break;
case 1: /* p->s_work */
#define INTERVAL_4_1 9
#define SPEED_SHOT_4_1 15
if (p->s_work2++ > 1) {
p->s_work2 = 0;
if (p->s_work3++ > 20) {
if (p->s_work3++ > 45) {
p->s_work++;
p->s_work3 = 0;
} else {
EshotAlloc (ESHOT_NRG04, SHORT_LX, SHORT_LY + 16, SPEED_SHOT_4_1, (rndtable[p->s_work3] & 0x3f) - 0x1f + psearch (p->x, p->y), 0);
SoundSetSE (SE_ESHOT); /* 敵ショット音 */
}
} else {
EshotAlloc (ESHOT_NRG03, SHORT_LX, SHORT_LY + 16, SPEED_SHOT_4_1 - 4, (rndtable[p->s_work3] & 0x3f) - 0x1f + psearch (p->x, p->y), 0);
SoundSetSE (SE_ESHOT); /* 敵ショット音 */
}
}
break;
case 2: /* p->s_work */
p->s_work = 0;
break;
default: /* p->s_work */
p->s_work = 0;
break;
}
break;
case 5: /* アニメーション開始! */
if (SubEnemyMoveTo (p) < 0) { /* 止まるまで待つ */
p->m_work++;
p->m_work2 = MOVETO_INIT; /* 移動方向 */
p->s_work = p->s_work2 = p->s_work3 = p->s_work4 = 0;
p->hit_sx = 70;
p->hit_sy = 16;
}
break;
/* 最後の攻撃 */
case 6:
if (p->timer > TIMER_3) {
p->m_work++; /* 時間切れ */
p->m_work2 = 0;
break;
}
/* まず移動処理 */
if (p->m_work2 == MOVETO_INIT) {
/* 初期状態なら */
if (p->x > player->x)
p->m_work2 = MOVETO_C2L; /* 移動方向 */
else
p->m_work2 = MOVETO_C2R; /* 移動方向 */
p->m_work3 = 0;
}
if (p->m_work3 == 0) {
/* 初回なら */
signed short dx, dy;
signed short dx_table[5] =
{0, 54 + 16, 128 + 16, 256 - 54 + 16, 128 + 16};
short m_work_table[5] =
{MOVETO_INIT, MOVETO_L2C, MOVETO_C2R, MOVETO_R2C, MOVETO_C2L};
p->m_work3 = !0;
/* 順に左→中央→右→中央→左へ移動 */
dx = dx_table[p->m_work2];
p->m_work2 = m_work_table[p->m_work2]; /* 移動方向 */
/* player->y は乱数の種として使用しています */
if (SHORT_LY < 64)
dy = (((unsigned short) rndtable[(player->y) & 0xff]) / 4 + 32);
else
dy = 48;
/* 移動方向を設定 */
SubEnemyMoveToInit (p, dx, dy, SPEED_1, SPEED_1N);
} else {
/* 設定値に従って移動 */
if (SubEnemyMoveTo (p) < 0)
p->m_work3 = 0; /* 移動方向再設定 */
}
/* 次に攻撃処理 */
/* 自機拘束弾 */
#define SPEED_SHOT_5_2 22
#define SPEED_SHOT_5_2_1 14
if (p->s_work2++ > 3) {
unsigned char a = psearch (p->x, p->y);
p->s_work2 = 0;
EshotAlloc (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT_5_2, a - 16, 0);
EshotAlloc (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT_5_2, a + 16, 0);
SoundSetSE (SE_ESHOT); /* 敵ショット音 */
if (p->s_work3++ > 110) {
p->s_work = 0; /* 最初に戻る */
p->s_work3 = 0;
} else {
EshotAlloc (ESHOT_NRG24N, SHORT_LX, SHORT_LY + 16, SPEED_SHOT_5_2_1 + 2, (rndtable[p->s_work3] & 31) - 16 + psearch (p->x, p->y), 0);
}
}
break;
/* 時間切れ撤退 */
case 7:
switch (p->m_work2) {
case 0:
if (SubEnemyMoveTo (p) < 0) { /* 止まるまで待つ */
p->m_work2++;
SubEnemyMoveToInit (p, p->x, -128, SPEED_3, SPEED_3N);
}
break;
case 1:
if (SubEnemyMoveTo (p) < 0) { /* 止まるまで待つ */
return (-1); /* 消去 */
}
break;
}
break;
/* 死んだ */
case MOVE_DEATH:
switch (p->m_work2) {
case 0:
if (SubEnemyMoveToAbort (p) < 0) { /* 止まるまで待つ */
p->m_work2++;
p->m_work3 = 0;
p->m_work4 = 0;
/* 当たり判定を無くす */
p->hit_sx = p->hit_sy = 0;
if (!eshot_erase)
eshot_erase = ESHOT_ERASE; /* 弾消し */
}
break;
case 1:
if (p->m_work3++ > 3) {
p->m_work3 = 0;
p->m_work4++;
if (p->m_work4 < 15) {
signed short x, y;
x = rndtable[(p->timer) & 0xff ^ 0x55] - 128;
y = rndtable[(p->timer) & 0xff ^ 0xaa] - 128;
/* p->timer は乱数の種として使用しています */
EffectAlloc (EFFECT_EXPL, 0, x / 2 + p->x, y / 4 + p->y + 16); /* 爆発パターンを出現させる */
SoundSetSE (SE_EXPL_M); /* 中ボス爆発音 */
}
if (p->m_work4 > 20) {
short h;
for (h = 0; h < 6; h++) {
EffectAlloc (EFFECT_EXPL, 0,
(signed short) ((rndtable[h] - 128) / 2) + p->x,
(signed short) ((rndtable[h + 1] - 128) / 4) + p->y + 16);
}
SoundSetSE (SE_EXPL_L); /* ボスキャラ爆発音 */
EffectAlloc (EFFECT_POINTS, POINTS_10000, p->x, p->y); /* 得点を出現させる */
// EffectAlloc (EFFECT_HAHEN, 0, p->x, p->y);
return (-1); /* 消去 */
}
}
break;
}
default:
break;
}
/* もし前回ダメージを受けたなら */
if (p->damage) {
p->hp -= p->damage;
p->damage = 0;
SoundSetSE (SE_DAMAGE); /* 敵ダメージ音 */
/* 白(or赤)フラッシュ処理 */
if (p->info == (PALET_MAIN | PRIORITY_BOSS)) {
if (p->hp < HP_PALET_RED)
p->info = PALET_RED | PRIORITY_BOSS;
else
p->info = PALET_DAMAGE | PRIORITY_BOSS;
} else {
p->info = PALET_MAIN | PRIORITY_BOSS;
}
/* 定期的に刺さったショットを抜く */
if ((p->m_work5++ > TIME_SHOT_ERASE) && (p->shot)) {
p->shot->status = SHOT_STATUS_NON;
p->m_work5 = 0;
}
/* 耐久力が0以下なら消去 */
if (p->hp <= 0) {
p->m_work = MOVE_DEATH;
p->m_work2 = 0;
/* 刺さったショットの処理 */
if (p->shot)
p->shot->status = SHOT_STATUS_NON;
}
} else {
/* 耐久力が少なくなったら赤フラッシュ */
if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < HP_2)) {
p->info = PALET_RED | PRIORITY_BOSS;
if (p->flash > TIMER_FLASH_NORMAL)
p->flash = 0;
} else {
p->info = PALET_MAIN | PRIORITY_BOSS;
}
p->m_work5 = 0;
}
xobj_set_st (p);
/* コアの表示 */
p->core_x = p->x - 8; /* コアの中心は (-8,-8) ドットずれる */
p->core_y = p->y - 8;
xsp_set_st (&(p->core_x));
/* コア2つ目 */
p->core_x = p->x - 8; /* コアの中心は (-8,+8) ドットずれる */
p->core_y = p->y + 8;
xsp_set_st (&(p->core_x));
return (0);
}
/* 消去ルーチン */
static void EnemyFreeLBoss01 (ENEMY * p)
{
/* 刺さったショットの処理 */
if ((p->shot) && (p->shot->enemy) && (p->shot->enemy == p))
p->shot->status = SHOT_STATUS_NON;
player->game_over = GAME_COMPLETE; /* ボスが消えたらゲーム終了 */
}